/**
 * 定义JSON数据项的类型接口
 */
export interface MapDataItem {
  id: number;
  cId: string;
  name: string;
  polygon?: string;
  polygonArea?: string;
  lon: number;
  lat: number;
  surfaceType: string;
  scale: number;
  provinceId: number;
  areaId: number;
  countyId: number;
  streetId: number;
  modelExist: string;
  uploadType: string;
  showName: string;
  titleBgHeight: string;
  isDelete: number;
  height: number;
  deleteWhiteModel: string;
  tenantId: number;
  commonId: number;
  modelType: number;
  // 可能存在的其他可选字段
  modelPath?: string;
  vrHttpUrl?: string;
  unit?: string;
  startPrice?: string;
  httpUrl?: string;
}

// 导入IndexedDB服务
import { 
  hasDataInIndexedDB, 
  getAllDataFromIndexedDB, 
  saveDataToIndexedDB 
} from './idbService';

/**
 * 动态导入JSON数据并提取modelExist='1'的数据
 * 优先从IndexedDB获取数据，若不存在则从JSON文件加载并存储到IndexedDB
 * @returns Promise<MapDataItem[]> 包含modelExist='1'的数据
 */
export const extractModelData = async (): Promise<MapDataItem[]> => {
  try {
    // 优先检查IndexedDB中是否有数据
    const hasData = await hasDataInIndexedDB();
    
    if (hasData) {
      // 从IndexedDB获取数据
      const dataFromDB = await getAllDataFromIndexedDB();
      // 过滤出modelExist='1'的数据
      const filteredData = dataFromDB.filter(item => item.modelExist === "1");
      console.log(`从IndexedDB获取数据成功，共${filteredData.length}条记录`);
      return filteredData;
    }
    
    console.log("IndexedDB中没有数据，从JSON文件加载");
    // 动态导入JSON文件
    const { default: data } = await import(
      "../assets/mapData/f9f3f288-d70c-4105-9959-e0761479d2cb.json"
    );
    // 过滤出modelExist='1'的数据
    const filteredData = (data as MapDataItem[]).filter(
      (item) => item.modelExist === "1"
    );
    
    // 将数据存储到IndexedDB
    try {
      await saveDataToIndexedDB(filteredData);
    } catch (error) {
      console.warn("数据存储到IndexedDB失败，但不影响应用运行:", error);
      // 存储失败不中断程序流程
    }
    
    return filteredData;
  } catch (error) {
    console.error("提取model数据失败:", error);
    return [];
  }
};

/**
 * 提供同步版本的API，用于需要立即访问数据的场景
 * 注意：此函数会在模块加载时立即执行，可能影响性能
 */
let cachedModelData: MapDataItem[] = [];
let isDataLoaded = false;

/**
 * 获取缓存的模型数据
 * @returns MapDataItem[] 缓存的模型数据集
 */
export const getCachedModelData = (): MapDataItem[] => {
  return cachedModelData;
};

/**
 * 检查数据是否已加载
 * @returns boolean 数据是否已加载
 */
export const isModelDataLoaded = (): boolean => {
  return isDataLoaded;
};

// 初始化时异步加载数据并缓存
(async () => {
  try {
    cachedModelData = await extractModelData();
    isDataLoaded = true;
  } catch (error) {
    console.error("缓存模型数据失败:", error);
  }
})();

export default extractModelData;
